home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The CICA Windows Explosion!
/
The CICA Windows Explosion! - Disc 1.iso
/
util
/
stdm15.zip
/
README.TXT
< prev
next >
Wrap
Text File
|
1994-12-16
|
32KB
|
944 lines
Stdemo Player 1.5
Copyright (c) 1992-1994 Mik Kvitchko
-------------------------------
| Mik Kvitchko |
| 37 Landsdowne Rd, |
| East Brunswick, NJ 08816 |
| USA |
|Internet: mik@cnj.digex.com |
|CompuServe: [74127,3671] |
-------------------------------
This package consists of the following files:
ADDON.TXT - Description of the add-on to StDemo Player
HIST.TXT - History of changes
README.TXT - This File
SCRIPT.TXT - Stdemo Player example script
STDEMO.DIZ - Stdemo Player short description.
STDEMO.EXE - Stdemo Player program
STHOOK.DLL - Stdemo Player DLL
What is this?
=============
Stdemo Player is the multy-purpose application. First of all, you can
use it to create demos and tutorials. It allows you to write a script,
which will start one or several Windows application and perform a series
of keystrokes or mouse actions aimed to demonstrate these applications.
While your script is being "played", you can disable completely keyboard
and mouse, so that user will not be able to interfere with the running
demo and to cause a conflict. At certain points of you script you may
interrupt it in order to interact with user. These interactions allow:
- to show the "text" box with some explanatory text before script
will continue ( this is the main idea of how demos and tutorials
are to be designed);
- to show the "menu" box where user can select one of several
choices, and therefore control the script's execution;
- to show the "input" box, where user can answer questions and
enter some text, which later can be used in script.
There are many varieties of these boxes in order to make your demo
flexible, and they can be forced to be shown in some convenient places
on the screen. Moreover, user can move them across the screen to be
able to see different parts of the covered windows.
Stdemo Player allows you even to play WAV files in order to make your
tutorial better.
Even if you are not interested in preparing demos, you may find Stdemo
Player useful. For example, you can replace your complete Startup Group
with the single Stdemo Player script which will launch all your "startup"
applications, and even perform some initial actions for every of them:
set up default options, load files, etc.
Another feature allows you to automate your everyday chores (like backup,
etc. ) by using the sheduling abilities of Stdemo Player script language.
How to play the script?
======================
When you run stdemo.exe without parameters, it looks for the file
"script.txt" in the current working directory, and if it is there -
"plays" it.
Also you may pass the name of the script as a parameter to stdemo.exe.
This name may include the full path.
How to write a script?
======================
Script is a plain ASCII text file. It may include:
- keystrokes;
- commands;
- interaction breaks;
- comments.
Every keystroke, command or interaction break is a unit. Stdemo Player
reads units from the script one by one and executes them. After one
unit is executed, Stdemo Player waits for some time (time-out tick,
which can be set or changed at any point in the script) and then
executes the next unit. Time-out doesn't affect the interaction breaks
(which are "text", "menu" and "input" dialog boxes). Once one of this
boxes is shown - only user may continue or stop script execution,
selecting "Continue" or "Stop" button on the box.
( See below how to program "auto-continue" for interaction breaks.)
Comments are ignored, as you may expect, and cause no time-out delays.
1. Keystrokes.
--------------
Any text in the script which is not a command, interaction break or
comment is a set of keystrokes, i.e. every symbol of the text causes a
keystroke to be sent into the current window application (see below).
There are also several special symbols which allow to simulate
different keyboard keys.
Any keystroke can be preceded by one or more special symbols
("@" - Alt, "#" - Shift or/and "%" - Control) as you see in the
following example:
@A Alt-A
#A Shift-A
%A Ctrl-A
#%A Shift-Ctrl-A
There are also many special keys which are coded by "escaping" them
with the "]". They are follows:
]| Down
]^ Up
]< Left
]> Right
]~ Tab
]! Return
]- PgUp
]+ PgDn
]\ Backspace
]Z Esc
]I Ins
]D Del
]H Home
]E End
]0 F10
]1 F1
...........
]9 F9
]] ]
]@ @
]% %
]# #
]: :
]$ $
This is not a full set of the keyboard keys, as you may note - but it
covers most of usable ones (I hope).
2. Commands.
------------
All commands start from the colon sign ":". Some of the commands must
be coded as a separate line in a script, others can be mixed with the
keystrokes. The rule of a thumb is: if a command has fixed format or
ends with the special separator - it can be placed anywhere, otherwise
it has to be coded as a separate line of the script. The general format
of a command is:
:<code><parameters>
<code> is a single letter or some other symbol;
<parameters> may vary; one parameter can be a letter, text or number;
parameters follow the code without blank, and in some cases are
separated one from another by the special separator "|".
ATTENTION: I strongly recommend to use ":C11" and ":I11" commands at
the beginning of your script, and remove them only after
your script will be debuged and tested. Otherwise you are
risking to lock up your system.
The commands are:
:Iab enable/disable Windows input;
parameter "a" must be coded as one digit:
0 - disable input, 1 - enable input;
parameter "b" is also 1 digit:
0 - temporarily, 1 - permanently.
Example:
:I10 enable input until the next interaction break.
Note:
When Stdemo starts, it disables Windows input
(keyboard and mouse buttons) in order to prevent
user's intervention into the actions being played.
When one of the interaction breaks occurs, the input
is partially restored to allow user interaction
inside the dialog box only. When script continues,
the state is restored as it was before the break.
"Temporarily change the state of Windows input" means
"until the next interaction break occurs". Permanent
change affects all subsequent script play and can be
changed with the next ":I" command only.
:Cab show/hide Windows cursor;
parameter "a" must be coded as one digit:
0 - hide cursor, 1 - show cursor;
parameter "b" is also 1 digit:
0 - temporarily, 1 - permanently.
Example:
:C11 show Windows cursor until further ":C" command.
Note:
When Stdemo starts, it hides Windows cursor.
When one of the interaction breaks occurs, the cursor
is restored to allow user interaction inside the
dialog box only. When script continues, the state is
restored as it was before the break.
"Temporarily change the visibility of cursor" means
"until the next interaction break occurs". Permanent
change affects all subsequent script play and can be
changed with the next ":C" command only.
:=x set time-out tick to x milliseconds.
Default time-out is 1 millisecond.
Example:
:=1000 set time-out tick to 1 sec.
:T skip 1 time-out tick.
Example:
abc:T:T:Tefg enter "abc", then wait for three
current time-out ticks, then enter
"efg".
:Wx delay script execution for x seconds
:Dtext change current directory to "text".
Example:
:Dc:\windows\system
:(program_name parm|x
launch the application;
program name must include extension (for the
security reason) and may include the full path;
parameters to the program can be passed, if
needed (not required);
flag x may be coded as one digit 0..2 after the
separator and affects the size of the
application window: 0 (default), 1(maximize),
2(minimize).
Note:
By deafult, Stdemo checks if the application
created active window, and if not - assumes
that something went wrong. This might create
problems if the application you are going to start
doesn't create window at all, or creates a hidden
window. See :c command below which disables this check.
Examples:
:(notepad.exe
:(c:\windows\write.exe demo.wri
:(notepad.exe c:\stdemo\readme.txt|2
:cX enable/disable check on active window after the :( command;
parameter "X" must be coded as one digit:
0 - disable check, 1 - enable check.
:<caption string|x find and activate/hide/destroy already running
application;
flag x may be coded as one digit 0..4 after the
separator and affects the size of the
application window: 0 (default), 1(maximize),
2(minimize), 3(hide), 4(destroy).
Note:
If the last symbol of <caption string> is "*" -
it is treated as a "wildcard", i.e. any window with
the caption which matches the "wildcarded" search string
fits the search condition.
Examples:
:<Notepad - (Untitled)|1
:<Notepad*|2
:) kill the last application in stack (if exists).
Note:
Stdemo Player allows to start several applications.
It keeps track of the applications being started in
the internal stack ( max. 50 entries). When you start
a new application, the following keystrokes will be
sent into the new application window, as it will
get focus after the launch. You must issue ":)" -
kill last application - command, even when you finish
the application using it's menu commands - so that
Stdemo Player could handle the stack of current
applications properly.
You can switch focus from one application to another
using :< command or you can do this by simulating mouse
clicking in the proper window. Just make sure that you
close applications in the reverse order as you started
them, and issue correspondent ":)" commands in the same
reverse order.
:Ltext assign the label "text" to the current point in
the script.
Note:
Script will jump to the special label "__STOP__" when
STOP button pressed on any interaction break box.
If there is no such label in the script - STOP will cause
just usual termination.
:Gtext goto label "text".
Note:
these two commands apparently do not require
explanation. Just note that so far there is no
conditional "goto" command (except of :?). You can
use ":G" command to code the loop, or to skip part of the
script during debugging. Labels are required when
you program a "menu" interaction break (see below).
:$ntext set variable n to "text" (n=0..9).
Example:
:$1Hello
:$2, how are you?
Note:
variables can be used among the keystrokes, i.e.,
using previous example, script "$1 Joe$2" will
play "Hello Joe, how are you?". Variables are
extensively used in the "input" interaction breaks
(see below).
:+x set interaction breaks' time-out tick to x seconds.
Default time-out is 0. (Maximum is 65 seconds).
Example:
:+10 set interaction breaks' time-out tick to 10 sec.
Note: The :+x command allows to set the special timer which will affect
execution of interaction breakes (TEXT, MENU and INPUT). Setting the value
of this timer somewhere in a script means that for all subsequent
communication breaks (dialog boxes) the "continue" button
will be "pressed" automatically after x seconds since
this dialog box was initially shown. :+0 disables this feature.
:Ra disable/enable 3-D effect for interaction breaks.
parameter "a" must be coded as one digit:
0 - disable 3-D, 1 - enable 3-D.
:Xa disable/enable/show/hide the "Stop" button on interaction breaks
parameter "a" must be coded as one digit:
0 - hide "Stop" button, 1 - disable "Stop" button,
2 - enable "Stop" button.
:Ya disable/enable/show/hide the "Continue" button on interaction breaks
parameter "a" must be coded as one digit:
0 - hide "Continue" button, 1 - disable "Continue" button,
2 - enable "Continue" button.
:Fx set the minimal point sizes for the font;
parameter "x" must be coded as a number and represents the
minimal point sizes for the font which is used when all
text doesn't fit into a text box. If it
is impossible to fit all text using the font bigger than
minimal - the defaul font will be used with the scrollbar
enabled. See also :d command to set up the default font size.
(Default is :F8).
:dx command sets the default size for the font (in point sizes);
parameter "x" must be coded as a number and represents the
default point sizes for the font which is used for the text
show in a text dialog box. See also the :F command to set
up the minimal size of the font. (Default is :d8).
:bx command allows to change the background color for text,
menu and input fields;
parameter "x" must be coded as a number and represents the
index of the color in system palette;
(default is blue - :b18).
:fx command allows to change the foreground color for text,
menu and input fields;
parameter "x" must be coded as a number and represents the
index of the color in system palette;
(default is black - :f0).
:p<filename>|f play the WAV file
flag f may be coded as one digit 0..3 after the
separator and affects the mode in which sound file is played:
0 (default) - synchronous mode;
1 - asyncronous mode (StDemo continues to run the following
script commands not waiting for sound to finish;
2 - loop mode -- the sound will continue to play repeatedly until
another :p command is executed;
3 - stop the currently playing sound (the <filename> is ignored
for this mode, i.e. you may code the command as ":p|3").
:Alabel|m|h|w|d|t command allows to create "cron"-like scheduling
of script execution. It triggers "goto label" operation if
parameters match current date and time. Parameter are treated
as: m - minutes (0 - 59), h - hours (0 - 23), w - day of
week (1-7), d - day of a month (1-31), t - month (1-12).
All parameters also can be coded as * ( any).
If parameters do not match current day/time - the next command
in a script will be executed.
Example:
:AReminder|30|9|*|9|8 goto label "Reminder" if today is August 9, 9:30am
:ADump|00|22|*|*|* goto label "Dump" on any day 10:00pm
:ASave|00|*|*|*|* goto label "Save" every 10 minutes
:ASave|10|*|*|*|*
:ASave|20|*|*|*|*
:ASave|30|*|*|*|*
:ASave|40|*|*|*|*
:ASave|50|*|*|*|*
Note:
1. Once :A command is executed - StDemo forgets about it. There
is no internal loop in StDemo in order to check if current
date/time matches some :A commands. It means that you have to
provide your own loop inside a script if you are going to
check this conditions repeatedly.
2. Be careful when after the successful execution of :A command
you switch control back to the loop: if the same :A command
will be executed again and conditions will match again - it
might execute your code again several times (when you expect
it to be run only once).
Example:
// main loop
:Start
:=1000
:ASave|00|*|*|*|*
:GStart
//
// subroutine to execute "Save"
:LSave (1)
.................
:GStart (2)
If you mean this script to execute "Save" once every hour -
your results will depend on how long will it take to execute
"save" subroutine. If it takes less than minute - next time
:A will be executed it might branch to :LSave again. You may
solve this problem by applying proper timing (use :=, :T, :U
or :W commands) but the best solution is to use :~ command with
the same date/time pattern which initiated your scheduled
subroutine (look below).
:Um|h|w|d|t command simplifies scheduling in some simple cases, it accepts
the same parameters as :A command (except of label) and simply
waits till current date/time will match given parameters. Be
careful, do not program infinite (or almost) loops.
:~m|h|w|d|t command has the same parameters as :U command and allows you
to wait till current date/time will NOT match given parameters.
The best use of this command is at the end of the scheduled
subroutine (see :A above).
Example:
:C11
:I11
:=1000
// Main loop
:Start
:=1000
:ABackup|0|4|*|*|*
:ACloseBackup|0|7|*|*|*
:ASendFax|30|16|*|*|*
:ACloseFax|50|16|*|*|*
// In case we want to terminate Stdemo Player at this time
:ATerminate|00|18|*|*|*
:GStart
// Backup subroutine
:LBackup
:DC:\backup
:(backup.exe
//..........
// send proper keystrokes to initiate backup
//..........
:~0|4|*|*|*
:GStart
// Send fax subroutine
:LSendFax
:DC:\winword
:(winword.exe report.doc
//..........
// send proper keystrokes to initiate fax
//..........
:~30|16|*|*|*
:GStart
:LCloseBackup
:<Backup
//..........
// send proper keystrokes to close backup window
//..........
:~0|7|*|*|*
:GStart
:LCloseFax
:<Microsoft Word - REPORT.DOC
//..........
// send proper keystrokes to close winword window
//..........
:~50|16|*|*|*
:GStart
// Termination
:LTerminate
:Z
:Z terminate script execution
:Va|b|c|d conditional branch depending on current screen resolution:
a - label for the 640x480 resolution
b - label for the 800x600 resolution
c - label for the 1024x768 resolution
d - label for the 1280x1024 resolution
Example:
:VP640|P800|P1024|P1280
:Z
:LP640
:#S
Resolution is 640x480
#
:Z
:LP800
:#S
Resolution is 800x600
#
:Z
:LP1024
:#S
Resolution is 1024x768
#
:Z
:LP1280
:#S
Resolution is 1280x1024
#
:Z
:?caption string|label branch to the label if window with the given
caption string exists;
Note:
If the last symbol of <caption string> is "*" -
it is treated as a "wildcard", i.e. any window with
the caption which matches the "wildcarded" search string
fits the search condition.
Examples:
:?Notepad - (Untitled)|FOUND_NOTEPAD
:?Notepad*|found
The following commands are to be used when you want some mouse actions
to be played from your script. It is not always possible to get a
reliable results with the mouse actions, assuming that your script can
be played with different display drivers in different Windows modes and
display resolutions. In order to cope with this, you must use "virtual"
coordinates, i.e. before using any command which has coordinates as a
parameter, you have to set "virtual screen/window size" and then all
following coordinates must be coded according to this size. When your
script will be played, Stdemo Player will determine the real current
screen/window size, and then adjust all your virtual coordinates
according to virtual/real ratio. You have to understand, that it is not
a perfect solution - for example, dialog boxes sizes are not
proportionally changed for different display resolutions, they depend
on the size of the system font rather than on display mode. But if you
code your mouse actions inside the dialog box, based on the dialog box
virtual size - it will work.
You may sometimes need to use absolute coordinates instead of relative,
define this in the :O command.
:Sx|y set virtual screen/window size.
Example:
:S1024|768
:S100|50
:Oabc set coordinates origin.
parameter "a" must be coded as one letter:
S - screen, A - application main window,
F - current focus window;
parameter "b" is also 1 letter:
C - client area, W - window area.
parameter "c" is also 1 letter:
V - virtual coordinates (default),
A - absolute coordinates.
Examples:
:OSWV
:OACA
:OFW
:Mx|y|n move mouse cursor to (x,y) in n steps.
Examples:
:S200|200
:OAC
:C11
:M100|100|1 set cursor in the center of the client area
of the main application window.
:M0|200|100 move cursor in 100 steps to the bottom-left
corner of the client area.
Note: Make sure that your coordinates agree with the
current modes set in ":S" and ":O" commands.
:Bab mouse button action.
parameter "a" must be coded as one letter:
L - left button, R - right button, M - middle;
parameter "b" must be coded as 1 digit:
1 - press, 0 - release, 2 - double-click.
Note: This command affects only client-area of a
window. You cannot simulate mouse-clicks in
non-client area using this command.
:Kab set keyboard state for some special keys.
parameter "a" must be coded as one letter:
S - Shift key, C - Control key, A - Alt key, I - Ins key;
parameter "b" must be coded as 1 digit:
1 - down, 0 - up.
Example:
:KS1:BL1:BL0:KS0 click the left mouse button when the
Shift key is down.
3. Interaction breaks.
----------------------
These are various dialog boxes which can be shown at any point of you
script, allowing therefore some interaction with user. There are three
classes of these boxes: "text", "menu" and "input". Each class contains
from 3 to 5 similar boxes, which vary by their size and by the number
of fields in them.
All boxes are coded in the script differently, but the common pattern
is:
<header line>
<one or more body lines>
<end-of-box delimiter line>
3.1 TEXT interaction break.
+++++++++++++++++++++++++++
Every TEXT box has a single text field which fills the dominant area of
the box.
The header line is:
:#sxy
parameter "s" defines the size and must be a letter:
S - small, M - medium, L - large, W - wide, N - narrow;
parameter x defines the position along the x-axis:
L - left adjusted, C - centered, R - right adjusted;
parameter y defines the position along the y-axis:
U - up adjusted, C - centered, D - down adjusted.
The body of this break consists from the text only, which will be shown
in the single text field of the box. Text may be coded as one or more
lines in the script, but it'll be placed continuously in the box,
applying word wrap. There are two special commands which can be entered
into the body of the TEXT box:
.N causes the following text start from a new line in a box;
.S causes to skip one line and continue to fill a box with the
following text.
The delimiter line is:
#
Example:
:#NCC
This is the narrow box, centered on the screen.
.S
This text starts after the empty line.
.N
This text starts from the beginning of the new line.
#
Notes: 1. The amount of text you can place into the text box
depends on the current display mode ( VGA, SVGA,
etc. ) and fonts supported by your current display
driver. This creates a problem: the text you placed
into the box might not fit when you run your demo on
a different system. In order to make sure, that it
will not happen, Stdemo Player checks if the whole
text fits into the box, and if not - it is trying to
reduce the font size, until the whole text fits. If
the system doesn't have a small enough font - the
scroll bar will be added to the text field, so that
user can read the whole text by scrolling it.
3.2 MENU interaction break.
+++++++++++++++++++++++++++
Every MENU box has a header text field on a top and from 2 to 9 menu
item fields ( radio buttons).
The header line is:
:*sxy
parameter "s" defines the size and must be a letter:
S - small, M - medium, L - large;
parameter x defines the position along the x-axis:
L - left adjusted, C - centered, R - right adjusted;
parameter y defines the position along the y-axis:
U - up adjusted, C - centered, D - down adjusted.
The body of this break consists from the text which will fill the
header text field of the menu box, and two or more menu lines.
Text may be coded as one or more lines anywhere in the body; it'll be
placed continuously in the header field, using word wrap if
appropriate. Text line should not start from a digit.
Every menu item line has the following format:
nlabel|item text
"n" is a menu item field number (1..9);
"label" - is a label in the script where control will be passed if this
item will be selected from the menu box.
"item text" is a text to fill the menu item field.
The delimiter line is:
*
Notes: 1. The "small" menu box has 2 menu fields, the
"medium" - 5 fields, and the large - 9 fields.
2. If there is no text for the header - the header
field will not be shown in the box.
3. If there is no lines for some menu items - the
correspondent item field will not be shown in the
box.
Example:
:*MCU
Select one of the three:
1l1|This is the first item
3l2|This is the second item
5l3|This is the third item
*
:Ll1
:#SCC
You've selected the first.
#
:Gcont
:Ll2
:#SCC
You've selected the second.
#
:Gcont
:Ll3
:#SCC
You've selected the third.
#
:Lcont
3.3 INPUT interaction break.
++++++++++++++++++++++++++++
Every INPUT box has a header text field on a top of the box and from 1
to 9 edit fields. The small box has only one edit field, the medium has
5, and the large has 9. Every edit field in the medium and large INPUT
boxes has the correspondent description field on a left of the every
edit field.
The header line is:
:%sxy
parameter "s" defines the size and must be a letter:
S - small, M - medium, L - large;
parameter x defines the position along the x-axis:
L - left adjusted, C - centered, R - right adjusted;
parameter y defines the position along the y-axis:
U - up adjusted, C - centered, D - down adjusted.
The body of this break consists from the text which will fill the
header text field of the menu box, and one or more input lines.
Text may be coded as one or more lines anywhere in the body; it'll be
placed continuously in the header field, using word wrap if
appropriate. Text line should not start from a digit.
Every input line has the following format:
nDescription_Text
"n" is a input field number (1..9); the correspondent input field will
be filled with the current value of the variable $n. If the variable is
empty - the field will also be empty.
"Description_Text" is a text to fill the description field for the "n"-
th input field.
The delimiter line is:
%
Notes: 1. The "small" input box has 1 edit field, the
"medium" - 5 fields, and the large - 9 fields.
2. If there is no text for the header - the header
field will not be shown in the box.
3. If there is no line for some edit field - the
correspondent edit and description fields will not
be shown in the box.
4. After user entered some text in the input field -
this text will be assigned to the correspondent
variable ($1..$9).
Example:
:(notepad.exe|1
:$2John
:%MCU
Please correct your name.
2Your first name:
4Your last name:
%
Hello, $2 $4!
:#SRD
Is my greeting correct?
#
:)
4. Comments.
------------
Any line in the script outside the interaction breaks, which starts
from "//" is being treated as a comment.
Known Problems.
===============
StDemo might misbehave if it is running together with
ALL3D package which forces all dialog boxes to have
3-D look provided by CTL3D.DLL
Script.txt runs up to 2 instances of Paintbrush, which
eat a lot of memory from the system heap. Make sure you have
sufficient amount of virtual memory available.
Future.
=======
I'm sure you noticed that the program can be further extended
( for example, auto recorder would not do any harm ). Please,
share your ideas with me, if you are interested.
Acknowledgments.
================
1. Thanks to CompuServe and all participants of the WinSdk
forum - you were my teachers, when I started programming
Windows.
2. Thanks to Brent Rector, whose book "Developing Windows 3
Applications" (and once he personally) helped me along
my way of learning Windows.
3. Thanks to my employers and friends Ken Winston and Michael
Markov; their enthusiasm kept me busy enough to grow.
Registration.
============
Stdemo Player is shareware.
The registration of a single licence will entitle you to use ONE
copy of Stdemo Player. Read about the Pro version in "addon.txt".
Site licence allows to redistribute StDemo run-time royalty free.
-----------------------------------------------------------------
| V E R S I O N
-----------------------------------------------------------------
Licence | Standard (w/src) | Professional (w/src)
-----------------------------------------------------------------
Single | $30 $60
Site | $300 ($600) $500 ($900)
-----------------------------------------------------------------
To register by mail, please send check or money order to:
Mik Kvitchko
37 Landsdowne Rd,
East Brunswick, NJ 08816
USA
To register on CompuServe, GO SWREG and find StDemo
(registration ID is 3276)
The price to register on CompuServe is higher to cover CompuServe's
charges: $35 for a single license and the rest accordingly.
To register Pro or site licence on CompuServe, simply register several
copies according to the following table:
-----------------------------------------------------------------
| V E R S I O N
-----------------------------------------------------------------
Licence | Standard (w/src) | Professional (w/src)
-----------------------------------------------------------------
Single | 1 copy 2 copies
Site | 10 copies(20 copies) 16 copies (30 copies)
-----------------------------------------------------------------
Then let me know by CompuServe mail what kind of registration is that.
When you register, I will replace irrelevant "MIK" icon on all dialog
boxes to another one (you may send your icon to me), remove "UNREGISTERED"
stamp from these dialog boxes and will send the updated copy to you.
Comments? Questions? Suggestions?
I will be glad if you contact me at:
Internet: mik@cnj.digex.com
CompuServe: [74127,3671]
You can make copies of this program and give them to others as long as
all files are included and unaltered.
Disclaimer.
===========
I've taken great care to ensure the program performs as stated. Still,
I cannot guarantee this will be the case on every system. As such, you
agree NOT to hold me responsible for ANY damages directly or indirectly
related to the use of Stdemo Player. The author of this software is not
responsible for any damage due to use of this program. This software
is provided without warrantee of any kind.
A Personal Note...
==================
I write C better than English. Please excuse my mistakes and funny
constructions in the above text, if you noted some (I'm sure, you
did!). Especially articles... They are incomprehensible!
Thanks!